#include <iostream>
#include <cstring>

//类：
//封装特性
//访问权限：public:公共权限：所有地方都可以访问
//         private:私有权限：只在本类可以访问
//         protected:保护权限：只在本类和本类的派生类可以访问

//类封装的一般习惯：
//1、属性对外访问关闭
//2、方法对外开放
class Student 
{
public:
    //无参构造函数
    Student()
    {
        std::cout<<"调用无参构造函数！"<<std::endl;
    }
    //带参构造函数
    Student(int id, const char *name)
    {        
        std::cout<<"调用有参构造函数！"<<std::endl;
        m_id = id;
        strcpy(m_name,name);
    }
    //拷贝构造函数：参数不能是类的对象，得是引用
    Student(Student &a)
    {
        std::cout<<"调用拷贝构造函数"<<std::endl;
        m_id = a.m_id;
        strcpy(m_name,a.m_name);
    }
    void Show()
    {
        std::cout<<"学生学号: "<<m_id<<" 学生姓名:"<<m_name<<std::endl;
    }

    ~Student()
    {
        std::cout<<"调用析构函数"<<std::endl;
    }

    void SetID(int id);
    int GetID();
    //函数的类内声明
    void SetName(const char *name);
    char * GetName();
private:
//变量：属性
//私有属性
    int m_id = 10;
    char m_name[32];
    int age;
    int grade;
};

// void Student::SetID(int id)
// {
//     m_id = id;
// }

int Student::GetID()
{
    return m_id;
}

// void Student::SetName(const char *name)
// {
//     strcpy(m_name,name);
// }

char * Student::GetName()
{
    return m_name;
}


int main()
{
    //Student s(1,"张三");
    // // s.SetID(30);
    // // s.SetName("小明")
    //std::cout<<"学生学号:"<<s.GetID()<<" 学生姓名:"<<s.GetName()<<std::endl;

    //Student *s = (Student *)malloc(sizeof(Student));
    //Student *s = new Student;

    // Student s(1,"zhangsan");
    // //拷贝构造
    // Student s2(s);    //括号法
    // Student s3 = s;   //等号法

    // Student s4;
    // s4 = s;

    Student *s1 = new Student;
    delete s1;


    return 0;
}